Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - [crypt]Idee algoritmo di cifratura per immagini
Forum - Algoritmi - [crypt]Idee algoritmo di cifratura per immagini

Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 11:36
Giovedì, 15/08/2013
Salve, mi sto cimentando nella creazione di un algoritmo che generi da una chiave e un immagine una seconda immagine che non presenti alcun riferimento visivo alla prima immagine, e che da essa si possa ritornare all'immagine di partenza mediante la chiave senza alcuna perdita di dati.
Fino ad ora ho pensato di operare su ogni pixel modificando il colore di esso sommando il valore ascii ricavati da un singolo carattere della chiave
Ecco il codice che ho adoperato:
Codice sorgente - presumibilmente Algoritmi

  1. keyArray = Encoding.ASCII.GetBytes(this.key);
  2.             int i = 0;
  3.             for (int y = 0; y < sourceImage.Height; y++)
  4.             {
  5.                 for (int x = 0; x < sourceImage.Width; x++)
  6.                 {
  7.                     Color pixelColor = sourceImage.GetPixel(x, y);
  8.                     int a = pixelColor.A + keyArray[i] - ((pixelColor.A + keyArray[i]>255)?256:0);
  9.                     i++;
  10.                     if (keyArray.Count() == i) i = 0;
  11.                     int r = pixelColor.R + keyArray[i] - ((pixelColor.R + keyArray[i] > 255) ? 256 : 0);
  12.                     i++;
  13.                     if (keyArray.Count() == i) i = 0;
  14.                     int g = pixelColor.G + keyArray[i] - ((pixelColor.G + keyArray[i] > 255) ? 256 : 0);
  15.                     i++;
  16.                     if (keyArray.Count() == i) i = 0;
  17.                     int b = pixelColor.B + keyArray[i] - ((pixelColor.B + keyArray[i] > 255) ? 256 : 0);
  18.                     i++;
  19.                     if (keyArray.Count() == i) i = 0;
  20.                     newImage.SetPixel(x, y, Color.FromArgb(a, r, g, b));
  21.                 }
  22.             }


Questo sistema è molto semplice e permette una facile decodifica, ma l'immagine è pressoché identica solo con i colori alterati se la chiave non è molto complessa.
Mi potreste aiutare, visto che non mi sono mai cimentato in un operazione del genere.
Grazie in anticipo


Roby94 ha allegato un file: crypt.example.png (11439 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
arack95 (Member)
Pro


Messaggi: 144
Iscritto: 15/11/2010

Segnala al moderatore
Postato alle 16:34
Giovedì, 15/08/2013
Prova a dare un'occhiata a questo articolo:
http://arxiv.org/pdf/1307.7791v1.pdf

PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 21:47
Giovedì, 15/08/2013
Quello che hai fatto è un Vigenerè modificato
Per rendere la chiave più complessa puoi usare un algoritmo di hashing che la porti ha una lunghezza fissa piuttosto lunga
Per rendere l'immagine meno riconoscibile poi dovresti fare in modo che cambino i valori di luminosità dei pixel (la media tra i valori dei colori) oppure modificare geometricamente l'immagine (rotazione di righe/colonne, traslazioni, mescolamenti)

Un ottima tecnica è quella della crittografia visuale (se cerchi nella sezione programmi ne ho scritto una implementazione in VB.NET), citata anche nell'articolo linkato da arack95, che scompone l'immagine in diversi layer che mostrano l'immagine solo se sovrapposti tutti (se ne manca anche solo uno non si ottiene nessuna informazione dell'immagine originale)

Se vuoi creare un nuovo algoritmo però devi inventare qualcosa di nuovo :rofl:

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:40
Venerdì, 16/08/2013
allora per iniziare grazie, ma la crittografia visuale non è proprio quello che cerco, voglio basarmi su algoritmi matematici che si devono basare su una chiave dando come risultato una sola immagine in modo che nessuno, che non sia in possesso della chiave e del suddetto algoritmo possa ottenere l'immagine di partenza. Stanotte mi mettero a leggermi per bene l'articolo (che sono contentissimo che sia disponibile solo in inglese XD) cosi vedo se trovo qualcosa che puo fare al caso mio. Per concludere rispondo a querty, si in effetti dovrei fare tante operazioni sui pixel ma ho paura di tirarmi la zappa sui piedi creando qualcosa che non abbia una via di ritorno.

PM Quote